use crate::vector::v_enum::enum_vec;

pub fn new_vec() {
    // 新建一个空的 vector 来储存 i32 类型的值
    let mut v: Vec<i32> = Vec::new();
    v.push(6);
    println!("Vec: {:#?}.", v);

    let v1 = vec![1, 2, 3];
    println!("Vec Mario: {:#?}.", v1);

    // 更新 vector
    let mut vs2 = Vec::new();
    vs2.push(5);
    vs2.push(6);
    vs2.push(7);
    vs2.push(8);
    println!("Vec vs2: {:#?}.", vs2);

    // 类似于任何其他的 struct，vector 在其离开作用域时会被释放
    {
        let vn = vec![1, 2, 3, 4];
        println!("Vec vn: {:#?}.", vn);

        // 处理变量 vn
    } // <- 这里 v 离开作用域并被丢弃


    // new vector
    let v = vec![1, 2, 3, 4, 5];

    // 使用 & 和 [] 返回一个引用
    let third: &i32 = &v[2];
    println!("The third element is {}", third);

    // 使用 get 方法以索引作为参数来返回一个 Option<&T>
    match v.get(2) {
        Some(third) => println!("The third element is {}", third),
        None => println!("There is no third element."),
    }
    let does_not_exist = v.get(100);
    println!("The 100 element is null: {}", does_not_exist.is_none());

    // for 循环
    let v = vec![100, 32, 57];
    for i in &v {
        println!("for each: {}", i);
    }

    // 也可以遍历可变 vector 的每一个元素的可变引用以便能改变他们
    let mut vi = vec![100, 32, 57];
    for ij in &mut vi {
        // 为了修改可变引用所指向的值，在使用 += 运算符之前必须使用解引用运算符（*）获取 i 中的值。
        *ij += 50;
        println!("for each +50: {}", ij);
    }

    enum_vec();
}

